/*
HashMap 默认使用一种 “密码学安全的”（“cryptographically strong” ）1 哈希函数，它可以抵抗拒绝服务（Denial of Service, DoS）攻击。然而这并不是可用的最快的算法。
*/
use std::collections::HashMap;
fn main() {
    {
        let mut tmpmap = HashMap::new();
        tmpmap.insert(String::from("lxin1"), 1);
        {
            // core::option::Option<i32>
            tmpmap.insert(String::from("lxin2"), 2);
            let tmpiter = tmpmap.insert(String::from("lxin1"), 0);
            println!("[{},{}]{}", file!(), line!(), type_str(&tmpiter));
            if let Some(tmpi32) = tmpiter {
                // 插入成功，并替换i32值。
                println!("[{},{}]insert lxin1 ok:{}", file!(), line!(), tmpi32);
                println!("[{},{}]map:{:?}", file!(), line!(), tmpmap);
            } else {
                println!("[{},{}]insert lxin1 fail", file!(), line!());
            }
        }
        {
            // 不存在lxin3，插入lxin3(3).
            let tmpopt = tmpmap.entry(String::from("lxin3")).or_insert(3);
            // 返回&mut i32，就是3
            println!("[{},{}]{}", file!(), line!(), type_str(&tmpopt));
            println!("[{},{}]entry lxin3 ={}", file!(), line!(), tmpopt);
            // 不存在lxin2，放弃插入lxin2(-1).
            let tmpopt1 = tmpmap.entry(String::from("lxin2")).or_insert(-1);
            // 虽然插入失败，但返回&mut i32，是2，而不是-1！
            println!("[{},{}]entry lxin2 ={}", file!(), line!(), tmpopt1);
            println!("[{},{}]map:{:?}", file!(), line!(), tmpmap);
        }
        {
            // which causes `tmpmap` to have type `HashMap<String, {integer}>`
            // HashMap根据第一个插入值确认key和val类型。
            // tmpmap.insert(1, 3);无法插入！key类型不一致！
            // tmpmap.insert("lxin2".to_string(), "345".to_string());//无法插入！value类型不一致！
        }
        {

            let tmpiter = tmpmap.get(&String::from("lxin1"));
            if let Some(tmpi32) = tmpiter {
                // 插入成功，并替换i32值。
                println!("[{},{}]find ok:{}", file!(), line!(), tmpi32);
            } else {
                println!("[{},{}]find fail", file!(), line!());
            }
        }
        {
            for (key, val) in &tmpmap {
                println!("[{},{}]get map:{},{}", file!(), line!(), key, val);
            }
        }
    }
    {
    }
}

fn type_str<T>(_val: &T) -> & 'static str {
    std::any::type_name::<T>()
}

